#ifndef SECURE_COMM_H
#define SECURE_COMM_H

#include <QObject>
#include <QtNetwork/QTcpServer>  // TCP 服务端核心类（基础通信必备）
#include <QtNetwork/QTcpSocket>  // TCP 客户端 Socket 类（基础通信必备）
#include <QList>                 // Qt 容器：存储已连接的客户端 Socket
#include <memory>                // 智能指针：管理 TCP 服务端内存（避免内存泄漏）

/**
 * @brief 基础 TCP 通信类（移除 SSL 功能，仅保留核心 TCP 连接与数据收发）
 * 功能：启动 TCP 服务端、处理客户端连接、收发二进制数据、管理客户端列表
 */
class SecureComm : public QObject
{
    Q_OBJECT  // Qt 信号槽机制必备（不可删除）

public:
    /**
     * @brief 构造函数
     * @param parent 父对象（Qt 内存管理机制：父对象销毁时自动销毁子对象）
     */
    explicit SecureComm(QObject *parent = nullptr);

    /**
     * @brief 析构函数（清理资源：关闭服务端、断开客户端连接）
     */
    ~SecureComm() override;

    /**
     * @brief 启动 TCP 服务端
     * @param port 监听端口（如 8888，需确保端口未被占用）
     * @return bool - true=启动成功，false=启动失败（如端口被占用）
     */
    bool startServer(quint16 port);

    /**
     * @brief 向指定客户端发送二进制数据
     * @param data 待发送的二进制数据（如序列化后的机器人指令）
     * @param clientSocket 目标客户端的 Socket 指针（需确保已连接）
     * @return bool - true=发送成功，false=发送失败（如客户端已断开）
     */
    bool sendData(const QByteArray& data, QTcpSocket* clientSocket);

    /**
     * @brief 获取当前已连接的客户端列表
     * @return QList<QTcpSocket*> - 客户端 Socket 指针列表（只读）
     */
    QList<QTcpSocket*> getConnectedClients() const;

signals:
    /**
     * @brief 数据接收信号（客户端发送数据时触发）
     * @param data 接收到的二进制数据
     * @param clientSocket 发送数据的客户端 Socket 指针（用于回传数据）
     */
    void dataReceived(const QByteArray& data, QTcpSocket* clientSocket);

    /**
     * @brief 客户端连接信号（新客户端成功连接时触发）
     * @param clientSocket 新连接的客户端 Socket 指针
     */
    void clientConnected(QTcpSocket* clientSocket);

    /**
     * @brief 客户端断开信号（客户端主动断开或网络异常时触发）
     * @param clientSocket 断开连接的客户端 Socket 指针
     */
    void clientDisconnected(QTcpSocket* clientSocket);

private slots:
    /**
     * @brief 处理新客户端连接（QTcpServer::newConnection 信号的回调函数）
     */
    void onNewConnection();

    /**
     * @brief 处理客户端数据接收（QTcpSocket::readyRead 信号的回调函数）
     */
    void onReadyRead();

    /**
     * @brief 处理客户端断开连接（QTcpSocket::disconnected 信号的回调函数）
     */
    void onDisconnected();

private:
    std::unique_ptr<QTcpServer> tcp_server_;    // TCP 服务端对象（智能指针自动管理内存）
    QList<QTcpSocket*> client_sockets_;         // 已连接的客户端 Socket 列表（用于管理所有客户端）
};

#endif // SECURE_COMM_H